package tree

import "fmt"

// #1
//func (node *Node) Traverse() {
//	if node == nil {
//		return
//	}
//
//	node.Left.Traverse() // 不用判断left是否为空，nil指针也可以调用方法
//	node.Print()
//	node.Right.Traverse()
//}

// #2 使用函数来遍历二叉树
func (node *Node) Traverse() {
	node.TraverserFunc(func(n *Node) {
		n.Print()
	})
	fmt.Println()
}

func (node *Node) TraverserFunc(f func(*Node)) {
	if node == nil {
		return
	}

	node.Left.TraverserFunc(f)
	f(node)
	node.Right.TraverserFunc(f)
}

func (node *Node)TraverseWithChannel() chan *Node {
	out := make(chan *Node)
	go func() {
		node.TraverserFunc(func(node *Node) {
			out <- node
		})
		close(out)
	}()
	return out
}
